At 23:33 +0300 on 18/5/98, The Web Administrator wrote:
> What I want is that the Primary Key (Only Key) be type_id, and int, and
> the first item that I insert should have type_id as '1', next will be
> '2' etc..
> I could have every insert into this table include a type_id, but that
> seems unessary.
> Can I have something like default='nextval' ?
This is so much a faq, that I went to look at the FAQ. In fact, there is a
question there which is similar to this one, but I think its phrasing
defeats newbies rather than helps them. I for one have never encountered
fields of type SERIAL, and people might not think it's the same sort of
question. The answer is even more of a problem, because the most commonly
used method of doing this is summarised in "look at the create_sequence
manual", whereas the two less recommended methods (using OIDs and using an
auto-incrementing function) are discussed in detail.
Bruce, don't you agree? Perhaps change the phrasing of the question to "How
do I create an auto-incrementing field?"
As for the answer itself, here it is:
In order to create an auto-incrementing field - one which will
automatically receive the value 1 for the first row inserted, 2 for the
second, and so on - you have to define a sequence. For example:
CREATE SEQUENCE emp_no;
Then you define your table. Assuming you want an employee table in which
the emp_id field is autoincrementing, here is what you write:
CREATE TABLE emp
(
emp_id int4
DEFAULT nextval( 'emp_no' )
NOT NULL
-- Other fields here
);
Following that, when you want to insert a row, insert values for all other
fields except the emp_id field. It will insert its own value automatically.
For more information, read the man page "create_sequence".
Herouth